package example.juc3;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * LockSupport
 * 线程阻塞工具类，可以实现线程在任意位置阻塞，阻塞后有对应的唤醒方法
 * 一个线程直接唤醒另一个阻塞的线程，即使另一个线程通知时还没有没阻塞，也可以实现停止阻塞
 * 因为unpark消耗了一个凭证，之后在调用park就可以正常通过不会阻塞，
 * unpark只能调用一次，因为凭证最多是1，但每次park都会消费1个凭证
 */
public class TestLockSupport {
    public static void main(String[] args) {
        Thread a = new Thread(() -> {
            try {
                System.out.println("进入");
                TimeUnit.SECONDS.sleep(3);
                LockSupport.park();// 阻塞住，准备被唤醒
                System.out.println("被唤醒");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"A");
        a.start();

        Thread b = new Thread(() -> {
            LockSupport.unpark(a);
            System.out.println("通知了");
        },"B");
        b.start();
    }
}
